package net.linku.repository;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import net.linku.domain.LAPrivilege;
import net.linku.enums.StatusEnum;
import net.linku.mapper.LAPrivilegeMapper;
import net.linku.model.req.login.UserRequestParams;
import net.linku.model.req.privilege.AdminPrivilegeQuery;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * LAPrivilegeRepository 是用于处理与 LAPrivilege 实体相关的数据库操作的存储库类。
 * 该类继承自 MyBatis-Plus 提供的 ServiceImpl 类，并实现 LAPrivilegeMapper 的 CRUD 操作。
 *
 * @Repository 注解表明该类是一个 Spring Repository（即 DAO 层），
 * 这样 Spring 容器可以识别并管理它的实例。
 * <p>
 * 该存储库类提供了一个额外的方法 queryPrivilegeByUserId，用于根据用户请求参数查询权限列表。
 * @author: SilenceTian
 * @date: 2024/7/12
 * @version: 1.0
 */
@Repository
public class LAPrivilegeRepository extends ServiceImpl<LAPrivilegeMapper, LAPrivilege> {

    /**
     * 根据用户请求参数查询权限列表。
     *
     * @param userRequestParams 用户请求参数，包含 tenantId 和 userId。
     * @return 返回根据租户ID和用户ID查询到的权限列表。
     * <p>
     * 该方法调用了 LAPrivilegeMapper 中的 queryPrivilegeByUserId 方法，
     * 通过传递 userRequestParams 对象来获取对应的权限列表。
     */
    public List<LAPrivilege> queryPrivilegeByUserId(UserRequestParams userRequestParams) {
        // 调用 Mapper 中的方法，根据租户ID和用户ID查询权限列表
        return this.baseMapper.queryPrivilegeByUserId(userRequestParams);
    }

    public Page<LAPrivilege> pagePrivilege(AdminPrivilegeQuery query) {
        // 获取查询条件
        LambdaQueryWrapper<LAPrivilege> lambdaQueryWrapper = bindQueryWrapper(query);

        // 创建分页对象
        Page<LAPrivilege> page = new Page<>(query.getCurrent(), query.getSize());

        // 根据查询条件进行分页查询
        Page<LAPrivilege> laPrivilegePage = this.baseMapper.selectPage(page, lambdaQueryWrapper);

        // 获取查询结果记录
        List<LAPrivilege> records = laPrivilegePage.getRecords();

        // 构建返回的分页对象
        Page<LAPrivilege> resultPage = new Page<>(query.getCurrent(), query.getSize(), laPrivilegePage.getTotal());
        resultPage.setRecords(records);

        return resultPage;
    }

    /**
     * 绑定查询条件
     *
     * @param query 查询条件对象，包含查询的字段和值。
     * @return 返回 LambdaQueryWrapper 对象，用于 MyBatis-Plus 的查询。
     */
    private LambdaQueryWrapper<LAPrivilege> bindQueryWrapper(AdminPrivilegeQuery query) {
        LambdaQueryWrapper<LAPrivilege> lambdaQueryWrapper = new LambdaQueryWrapper<>();

        // 获取查询条件，并将其绑定到查询包装器中
        if (query.getId() != null) {
            lambdaQueryWrapper.eq(LAPrivilege::getId, query.getId());
        }
        if (query.getTenantId() != null) {
            lambdaQueryWrapper.eq(LAPrivilege::getTenantId, query.getTenantId());
        }
        if (query.getMenuId() != null) {
            lambdaQueryWrapper.eq(LAPrivilege::getMenuId, query.getMenuId());
        }
        if (query.getName() != null) {
            lambdaQueryWrapper.like(LAPrivilege::getName, query.getName());
        }
        if (query.getDescription() != null) {
            lambdaQueryWrapper.like(LAPrivilege::getDescription, query.getDescription());
        }
        if (query.getUrl() != null) {
            lambdaQueryWrapper.like(LAPrivilege::getUrl, query.getUrl());
        }
        if (query.getMethod() != null) {
            lambdaQueryWrapper.like(LAPrivilege::getMethod, query.getMethod());
        }

        // 添加条件，筛选未删除的菜单
        lambdaQueryWrapper.eq(LAPrivilege::getDeletedFlag, StatusEnum.NORMAL.getDeletedFlag());
        // 根据更新时间排序
        lambdaQueryWrapper.orderByDesc(LAPrivilege::getLastUpdateDate);

        return lambdaQueryWrapper;
    }
}
